自动装配Bean属性
Spring提供了4种类型的自动装配:
- byName:把与bean的属性具有相同名字或者相同Id的其它Bean自动装配到bean对应的属性中.如果没有跟属性的名字相匹配的bean,则不进行装配.
- byType:把与bean的属性具有相同类型的其它Bean自动装配到bean对应的属性中.如果没有跟属性的类型相匹配的bean,则不进行装配.
- constructor:把与bean的构造器入参具有相同类型的其它bean自动装配到Bean构造器的对应入参中.
- autodetect:首先尝试使用constructor进行自动装配,如果失败,再尝试使用byType进行自动装配.
byName自动装配
|
|
byName自动装配遵循一个原则,就是:为属性自动装配ID与该属性名字相同的Bean.
byType自动装配
这种方存在一个缺陷,就是有多个类型相同的bean时,会报错.我们可以设置首选bean,或者取消某个bean的候选资格.但是bean默认的都是首选bean,所以为了达到目的,我们不得不,取消所有类型相同bean的默认首选,使用primary=”false”,然后将要注入的bean设置为首选bean,primary=”true”.
或者取消某些bean的候选资格,使用autowire-candidate=”false”.
constructor自动装配
和byType自动装配有相同的局限性
最佳自动装配
设置autowired=”autodetect”,Spring会优先使用constructor自动装配,如果没有发现与构造器相匹配的bean时,使用byType自动装配.
默认自动装配
default-autowired=”XXX”
使用注解装配
Spring容器默认禁止自动装配,所以,使用前,需要在Spring配置中启用它.
|
|
Spring3支持几种不同的用于自动装配的注解:
- Spring自带的@Autowired注解
- JSR-330的@Inject注解
- JSR-250的@Resource注解
使用@Autowired注解
@Autowired可以用来自动装配setter,构造器,甚至是非setter方法注入.
并且不会受限于private关键字,即使是private的,也会自动装配.
但是也有缺点:
应用中必须只能有一个Bean适合装配到@Autowired注解所标注的
属性或者参数中.如果没有匹配的bean或者有多个匹配的Bean,@Autowired注解就会遇到一些麻烦.
可选的自动装配
设置@Autowired(required=false),没有匹配bean也可以接受,而不会抛出空指针.或者NoSuchBeanDefinationException.
这时候如果没有匹配的,bean属性值就会是null.
tips:当使用构造器Autowired时,只有一个构造器可以将required设置为true,其它使用autowired的构造器只能设置为false.此外,当使用autowired标注多个构造器时,spring就会从所有满足装配条件的构造器中选择入参最多的那个构造器.
限定歧义性的依赖
使用Qualifier=”XX”将有多个相同类型的bean限定到一个.
将autowired的byType装配转换成byName装配.
创建自定义的限定器(Qualifier)
|
|
通过自定义的@StringedInsrument 注解,我们现在可以用它代替@Qualifier来标注Guitar:
|
|
现在我们也可以使用@StringedInsrument对自动装配的Instrument属性进行限定:
|
|